/**
 * @description Platform detection tokenizer
 *
 *
 */
Jx.categorize('code.platform.tokenizer', {

	$singleton: true,

	$extend: 'Jx.lib.Tokenizer',

	stringRe: /[A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-0-9\u00B7\u0300-\u036F\u203F-\u2040]/,

	states: {

		'start': {

			'1': 'number',
			'2': 'number',
			'3': 'number',
			'4': 'number',
			'5': 'number',
			'6': 'number',
			'7': 'number',
			'8': 'number',
			'9': 'number',

			'>': 'gt',
			'=': 'equ',
			'<': 'lt',

			'[*]': 'excess'

		},

		'number': {

			'1': 'number',
			'2': 'number',
			'3': 'number',
			'4': 'number',
			'5': 'number',
			'6': 'number',
			'7': 'number',
			'8': 'number',
			'9': 'number',
			'0': 'number',
			'.': 'float_start'

		},

		'float_start': {

			'1': 'float',
			'2': 'float',
			'3': 'float',
			'4': 'float',
			'5': 'float',
			'6': 'float',
			'7': 'float',
			'8': 'float',
			'9': 'float',
			'0': 'float'

		},

		'float': {

			'1': 'float',
			'2': 'float',
			'3': 'float',
			'4': 'float',
			'5': 'float',
			'6': 'float',
			'7': 'float',
			'8': 'float',
			'9': 'float',
			'0': 'float',
			'.': 'float_version_start'

		},

		'float_version_start': {

			'1': 'float_version',
			'2': 'float_version',
			'3': 'float_version',
			'4': 'float_version',
			'5': 'float_version',
			'6': 'float_version',
			'7': 'float_version',
			'8': 'float_version',
			'9': 'float_version',
			'0': 'float_version'

		},

		'float_version': {

			'1': 'float_version',
			'2': 'float_version',
			'3': 'float_version',
			'4': 'float_version',
			'5': 'float_version',
			'6': 'float_version',
			'7': 'float_version',
			'8': 'float_version',
			'9': 'float_version',
			'0': 'float_version',
			'.': 'float_version_start'

		},

		'gt': {

			'=': 'gte'

		},

		'lt': {

			'=': 'lte'

		},

		'equ': {

			'=': 'dequ'

		},

		'excess': {

			'[*]': 'excess'

		},

		'gte': {},

		'lte': {},

		'dequ': {}


	},

	stateCallback: {

		'number': function(chr){

			this.appendBuffer(chr);

			return 'number';

		},

		'float': function(chr){

			this.appendBuffer(chr);

			return 'float';

		},

		'float_version': function(chr){

			this.appendBuffer(chr);

			return 'version';

		},

		'gt': function(chr){

			this.appendBuffer(chr);

			return 'op_gt';

		},

		'gte': function(chr){

			this.appendBuffer(chr);

			return 'op_gte';

		},

		'lt': function(chr){

			this.appendBuffer(chr);

			return 'op_lt';

		},

		'lte': function(chr){

			this.appendBuffer(chr);

			return 'op_lte';

		},

		'equ': function(chr){

			this.appendBuffer(chr);

			return 'op_equ';

		},

		'dequ': function(chr){

			return 'op_equ';

		},

		'excess': function(chr, input, state, previousState){

			if (this.stringRe.test(chr)){

				//-- restart state
				this.state = 'excess';

				this.appendBuffer(chr);

				return 'string';

			} else {

				return false;

			}

		}



	}



});
